Loading...
Loading...
Loading...

目录


35.搜索插入位置

计算机编程 发布于:2022/3/22/20:57 1018 vk python 数据结构与算法 最近编辑于2 年,9 月前 预计阅读时长:5min

本题来自力扣35题搜索插入位置  难度:简单

反转列表

如果元素在列表中,那么直接返回位置即可很简单,如果不在,那么就用到了题目的话:搜索插入位置

首先,我想到的是遍历列表,目标元素和列表里的元素比较,如果目标元素比列表里的元素大那么就插入。

后来以失败告终,现在想想这个想法还是挺傻的,target=,5num=[2,3,4,8],5比2,3,4都大,应该插入到比目标元素小的中的最大的一个。这么做还要额外开辟空间记录比目标元素小的元素有哪些,果断放弃。

换个思路,只要将列表反转过来,判断目标元素比列表里的元素大就行,那么第一个满足条件的就应该是正确的 num=[1,3,5,6] target=4 反转后nums=[6,5,3,1],那么 在3的前面就满足条件4>3就不会往后走了,只需要记录3的索引值+1就是应该插入的位置。如果target比列表里的任何一个元素都小,那么直接返回0就行

    def searchInsert(self, nums: List[int], target: int) -> int:
        if target in nums:
            return nums.index(target)
        else:
			 for i in nums[::-1]:
                if target<nums[0]:
                    return 0
                if target>i:
                    return nums.index(i)+1

二分查找

想找到插入的位置,可以用二分查找,类似于猜商品价格。

客户:40

老板:大了

客户:20

老板:小了

客户:30

老板:没错

 def searchInsert(self, nums: List[int], target: int) -> int:


        low, high = 0, len(nums) - 1

        # 在 [low, high] 找 target
        while low <= high:

            mid = (low + high) // 2

            # 如果 target 找到,直接返回位置
            if nums[mid] == target:
                return mid
            # 如果 target 大于中间数,则 target 可能在右区间
            # 在 [mid + 1, left] 中找
            elif nums[mid] < target:
                low = mid + 1
            # 如果 target 小于中间数,则 target 可能在左区间
            # 在 [left, mid -1] 中找
            else:
                high = mid - 1
        
        # 如果在数组中没找到,则返回需要插入数值的位置
        return high + 1

一直循环直到左边界大于右边界,将target值与中间数做比较,大了它就在中间数右边界,同时重置区间,左边界应该从0中间数右边那个开始,再次判断新的区间的中间数与目标值的大小关系,以此类推直到找到目标数为止。

如果目标值小于列表里的任何一个数,那么右边界(high值)就会一直减小直到它和左边界相等为止,此时它们都为0,然后再次进入 

  else:
       	high = mid - 1

这句判断,high被减小为-1,返回的时候将high+1就是0了

同理,如果target比列表里任何一个值都大,那么左边界(low值)就会不断增加,直到与high相等都为len(nums)-1为止,此时最后一遍循环进入

elif nums[mid] < target:
       low = mid + 1            

high一直没变为原列表最后一个数字的索引,现在在最右边插入一个target那么它的索引自然就是high+1了

单词数:136字符数:1786

共有0条评论